﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AlgoHero.Controlador;
using System.Threading;
using AlgoHero.Modelo;

namespace AlgoHero.Vista
{
    public partial class VentanaAlgoHero : Form
    {
        private Font fontDeOpcionesNormal;
        private Font fontDeOpcionesSobre;
        private Color colorDeOpcionesSobre;
        private Color colorDeOpcionesNormal;
        private Color colorDeFondo;
        private Juego juego;
        private Fiuba.Algo3.Titiritero.Vista.Panel superficieDeDibujo;

        private delegate void SetTextDelegate();
        List<Keys> teclasApretadas;

        public VentanaAlgoHero()
        {
            InitializeComponent();
            this.fontDeOpcionesNormal = new Font("Calibri", 20);
            this.fontDeOpcionesSobre = new Font("Calibri", 24);
            this.colorDeOpcionesSobre = Color.Yellow;
            this.colorDeOpcionesNormal = Color.White;
            this.colorDeFondo = Color.Black;
            this.juego = new Juego(this.superficieDeDibujo);
            this.teclasApretadas = new List<Keys>();
        }

        private void SetText()
        {
            if (this.juego.EstaTerminado)
            {
                this.retomarControl();
            }
            //this.Text = GetKeys();
        }

        //private string GetKeys()
        //{
        //    lock (teclasApretadas)
        //    {
        //        return String.Join(", ", teclasApretadas.Select(item => item.ToString()).ToArray());
        //    }
        //}

        private IList<Tecla> GetTeclasApretadas()
        {
            List<Tecla> listaTeclas = new List<Tecla>();
            foreach (Keys key in teclasApretadas)
            {
                listaTeclas.Add(new Tecla(key));
            }
            return listaTeclas;
        }

        private void retomarControl()
        {
            this.juego.TerminarJuego();
            this.superficieDeDibujo.Visible = false;
            this.menuPrincipal.Visible = true;
        }

        private void inputDelUsuario_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter)
            {
                if (!this.juego.EstaPausado)
                {
                    this.juego.PausarJuego();
                }
                else
                {
                    this.juego.ReanudarJuego();
                }
            }
            if (e.KeyCode == Keys.Escape)
            {
                this.retomarControl();
            }
            else
            {
                AddKey(e.KeyCode);
            }

        }

        private void inputDelUsuario_KeyUp(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Escape)
            {

            }
            else
            {
                RemoveKey(e.KeyCode);
            }

        }

        private void AddKey(Keys key)
        {
            lock (teclasApretadas)
            {
                if (!teclasApretadas.Contains(key))
                    teclasApretadas.Add(key);
            }
        }

        private void RemoveKey(Keys key)
        {
            lock (teclasApretadas)
            {
                if (teclasApretadas.Contains(key))
                {
                    teclasApretadas.Remove(key);
                }
            }
        }

        private void VentanaAlgoHero_Load(object sender, EventArgs e)
        {
            this.BackgroundImage = Image.FromFile(@"Recursos\imagenPrincipal.bmp");
            this.CenterToScreen();
            this.Font = fontDeOpcionesNormal;
            this.menuPrincipal.BackColor = colorDeFondo;
            this.menuDeSeleccionCancion.BackColor = colorDeFondo;
            this.menuPrincipal.ForeColor = colorDeOpcionesNormal;
            this.menuDeSeleccionCancion.ForeColor = colorDeOpcionesNormal;
            this.menuDeSeleccionCancion.Visible = false;
            this.superficieDeDibujo.Visible = false;
        }

        private void salir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void salir_MouseHover(object sender, EventArgs e)
        {
            this.salir.Font = fontDeOpcionesSobre;
            this.salir.ForeColor = colorDeOpcionesSobre;
        }

        private void salir_MouseLeave(object sender, EventArgs e)
        {
            this.salir.Font = fontDeOpcionesNormal;
            this.salir.ForeColor = colorDeOpcionesNormal;
        }

        private void empezarJuego_MouseHover(object sender, EventArgs e)
        {
            this.empezarJuego.Font = fontDeOpcionesSobre;
            this.empezarJuego.ForeColor = colorDeOpcionesSobre;
        }

        private void empezarJuego_MouseLeave(object sender, EventArgs e)
        {
            this.empezarJuego.Font = fontDeOpcionesNormal;
            this.empezarJuego.ForeColor = colorDeOpcionesNormal;
        }

        private void empezarJuego_Click(object sender, EventArgs e)
        {
            this.menuPrincipal.Visible = false;
            this.juego.InicializarJuego();
            this.menuDeSeleccionCancion.Visible = true;
        }

        private void volverAMenuPrincipal_Click(object sender, EventArgs e)
        {
            this.menuDeSeleccionCancion.Visible = false;
            this.menuPrincipal.Visible = true;
        }

        private void volverAMenuPrincipal_MouseHover(object sender, EventArgs e)
        {
            this.volverAMenuPrincipal.Font = fontDeOpcionesSobre;
            this.volverAMenuPrincipal.ForeColor = colorDeOpcionesSobre;
        }

        private void volverAMenuPrincipal_MouseLeave(object sender, EventArgs e)
        {
            this.volverAMenuPrincipal.Font = fontDeOpcionesNormal;
            this.volverAMenuPrincipal.ForeColor = colorDeOpcionesNormal;
        }

        private void cancion_Click(object sender, EventArgs e)
        {
            this.menuDeSeleccionCancion.Visible = false;
            this.superficieDeDibujo.Visible = true;
            this.juego.EmpezarAJugarConCancion(@"Recursos\Mary Had A Little Lamb.xml");
            //Cumpleaños Feliz
            //Mary Had A Little Lamb

            Thread threadTeclas = new Thread(new ThreadStart(this.enviarTeclas));
            threadTeclas.Start();
        }

        private void enviarTeclas()
        {
            SetTextDelegate setText = new SetTextDelegate(SetText);
            while (this.superficieDeDibujo.Visible)
            {
                this.juego.ProcesaTeclasJugadas(this.GetTeclasApretadas());
                this.superficieDeDibujo.Invoke(setText);
                Thread.Sleep(100);
            }
        }
    }
}
